# -*- coding: utf-8 -*-
from datetime import datetime

import pandas as pd


# 根据学号分组，然后应用加权平均计算函数
def weighted_average(group):
    WGA = (group['总成绩'] * group['学分']).sum() / group['学分'].sum()  # Σ(成绩*学分)/Σ学分
    return round(WGA, 2)


def main():
    path = '/Users/lidaoyu/Downloads/成绩信息.xls'  # 包含所有成绩信息的成绩总库
    data = pd.read_excel(path)

    # 正常考试信息
    normal_data = data[
        (data['辅修课程'] == '否') &  # 不计辅修课程
        (data['考试性质'] != '重修一') &  # 不计重修课程
        ~(data['课程名称'].str.startswith('体育')) &  # 不计体育课程
        (data['考试性质'] == '正常考试')  # 正常考试信息表
        ]

    failed_data = data[data['考试性质'].str.startswith('补考')]  # 补考成绩信息表

    # 将failed_data中"总成绩"更大的记录更新到normal_data中
    for index, row in failed_data.iterrows():  # 对每条补考成绩信息处理
        mask = (normal_data['学号'] == row['学号']) & (normal_data['课程名称'] == row['课程名称'])
        # 正常考试信息表中的(学号, 课程名称) == 补考成绩信息表中的(学号, 课程名称)
        if not normal_data[mask].empty and row['总成绩'] > normal_data[mask]['总成绩'].values[0]:  # 补考成绩 > 初考成绩
            normal_data.loc[mask, '总成绩'] = min(60, row['总成绩'])  # 将正常考试信息表中的'总成绩'列更新为min(60, 补考成绩)

    # 按学号分组计算加权平均成绩
    result = normal_data.groupby('学号').apply(weighted_average).reset_index()
    result.columns = ['学号', '加权平均成绩']

    # 使用merge函数合并计算结果和原始数据
    merged_data = pd.merge(normal_data, result, on='学号', how='left')

    # 去除重复的学号记录，保留每个学号的唯一一条记录
    unique_merged_data = merged_data.drop_duplicates(subset='学号')

    # 选择保留的列
    selected_columns = ['班级名称', '学号', '姓名', '加权平均成绩']
    final_data = unique_merged_data[selected_columns]

    # 更改列名
    new_column_names = {'班级名称': '班级', '学号': '学号', '姓名': '姓名', '加权平均成绩': '加权平均成绩'}
    final_data = final_data.rename(columns=new_column_names)

    # 按照班级(主要关键字)、学号升序排序
    final_data_sorted = final_data.sort_values(by=['班级', '学号'], ascending=[True, True])

    # 保存Excel文件
    final_data_sorted.to_excel(f'加权平均成绩{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}.xlsx', index=False)  # 结果导出到Excel
    print("文件已生成!")


if __name__ == '__main__':
    main()
